package weeek2;

import java.util.Random;

//b.创建一个Java程序，其中定义一个共享的银行账户类`BankAccount`，
//该类有一个余额成员变量`balance`和两个方法：`deposit(int amount)`用于存款，
//`withdraw(int amount)`用于取款。创建多个线程，每个线程代表一个用户，随机
//对账户进行存款和取款操作。使用`synchronized`关键字确保账户余额的更新是线程安全的，并打印出每次操作后的账户余额。
//提示：
//- 在`BankAccount`类的`deposit`和`withdraw`方法上使用`synchronized`关键字来确保同一时间只有一个线程可以访问这些方法。
//- 创建多个线程，每个线程在循环中随机选择存款或取款操作，并调用相应的同步方法
public
class Demo2 {
    static Random r=new Random();
    static BankAccount ba=new BankAccount();
    public static
    void main(String[] args) {

        for (int i=1;i<3;i++) {
            new Thread(()->{
                while (true) {
                    int amount= (r.nextInt(9)+1)*100;
                    switch (r.nextInt(2)+1){
                        case 1: ba.deposit(amount);break;
                        case 2: ba.withdraw(amount);break;
                    }
                }
            },"用户"+i).start();
        }
    }
}
class BankAccount{
    int balance=100;

    public synchronized void deposit(int amount){
        String name=Thread.currentThread().getName();
        balance+=amount;
        System.out.println(name+"存款完成,存款金额："+amount+"，余额："+balance);
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    public synchronized void withdraw(int amount){
        String name=Thread.currentThread().getName();
        if(balance>=amount) {
            balance -= amount;
            System.out.println(name+"取款完成,取款金额"+amount+"，余额："+balance);
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        else System.out.println(name+"取款"+amount+"，余额"+balance+"，余额不足");
    }
}